《Vim实用技巧》-开始:Vim解决问题的方式

GO


技巧1 结识 . 命令

理想的编辑模式:用一次按键移动,用另一次按键执行。

. 命令可以重复上次修改。

上次修改 可以指很多东西,一次修改的单位可以是字符、整行,甚至是整个文件。

每次进入插入模式时,也会形成一次修改。从进入插入模式的那一刻起(例如,输入i),直到返回普通模式时为止(输入 Esc ),Vim 会记录每一个按键操作。做出这样一个修改后再用 . 命令,就会重新执行所有的这些按键操作。

补充内容

  • x 命令会删除光标下的字符
  • dd 命令会删除光标所在的一整行
  • >G 命令会增加从当前行到文档末尾处的缩进层级

技巧2 不要自我重复

对于在行尾添加内容这样的常见操作,如添加分号,Vim 提供了一个专门的命令,可以把两步操作合并为一步。

减少无关紧要的移动。以下面的一个例子来说明:

a 命令在当前光标后添加内容,而 A 命令则在当前行的结尾添加内容。不管光标当前处于什么位置,输入 A 都会进入插入模式,并把光标移动行尾。换句话说,它把 $a 封装成了一个按键操作。

很多Vim的单键命令都可以被看成两个或多个其他命令的组合。下表列出了类似的一些例子:

复合命令 等效的长命令
C c$
s cl
S ^c
A $a
o A
O ko

上表所示这些命令的共同点是,它们全都会从普通模式切换到插入模式。

补充内容

  • $ 命令把光标移到行尾
  • j 命令使光标下移一行

技巧3 以退为进

我们可以用一种常用的 Vim 操作习惯在一个字符前后各添加一个空格。乍一看,这种方法有点古怪,不过其好处是可重复,这将使我们可以事半功倍地完成工作

先后退一步或多步,然后前进一步或多步,这是个奇怪的小花招,看起来可能不够直接。但这样做最大的好处是:我们可以用 . 命令重复这一修改。

与其和 Vim 区分模式的编辑模型做斗争,倒不如与它一起协同工作。然后,你就会发现它能把特定任务变得多么的容易。

补充内容

  • s 命令把两个操作合并为一个:它先删除光标下的字符,然后进入插入模式

技巧4 执行、重复、回退

在面对重复性工作时,我们需要让移动动作和修改都能够重复,这样就可以达到一个最佳编辑模式。Vim对此的支持是:它会记住我们的操作,并使最常用的操作触手可及,所以我们可以很方便地重复执行它们。本节将介绍 Vim 可以重复执行的每个操作,并学习如何回退这些命令。

当 Vim 让一个操作或移动可以很方便地重复时,它总是会提供某种方式,让我们
在不小心做过头时能回退回来。下表总结了Vim中可重复执行的命令,以及相应的回退方式。在多数场景中,撤销(Undo)都是很有用的帮助。

目的 操作 重复 回退
做出一个修改 {edit} . u
在行内查找下一指定字符 f{char}/t{char} ; ,
在行内查找上一指定字符 F{char}/T{char} ; ,
在文档中查找下一出匹配项 /pattern n N
在文档中查找上一项匹配项 ?pattern n N
执行替换 :s/target/replacement & u
执行一系列修改 qx{changes}q @x u

技巧5 查找并手动替换

Vim 提供了一个 :substitute 命令专门用于查找替换任务,不过用上面介绍的技术,我们也可以手动修改第一处地方,然后再一个个地查找替换其他匹配项。 . 命令可以把我们从繁重的工作中解放出来,而即将登场的另一个有用的单键命令,则能够让我们方便地在匹配项间跳转。这样才能逐个决定每一个匹配项是否需要操作。

补充内容

  • *将文档中光标所在单词全部匹配出来并高亮显示
  • :set hls 设置高亮显示
  • cw 命令会删除从光标位置到单词结尾的字符,并进入插入模式

技巧6 结识 . 范式

理想模式:用一键移动,另一键执行

  • 所有这些例子都利用 . 命令重复上次的修改,不过这不是它们唯一的共同点,另外的共同点是它们都只需要按一次键就能把光标移到下一个目标上。
  • 用一次按键移动,另一次按键执行,没有再比这更好的了,不是吗?这就是我们的理想解决方案。为了方便起见,我们把它叫做“ . 范式”

总结

回顾前面3个 . 命令编辑任务

  • 在技巧 2 中,我们想在一系列行的结尾添加分号。我们先用 A; <Esc> 修改了第一行,做完这步准备后,就可以使用 . 命令对后续行重复此修改。我们使用了 j 命令在行间移动,要完成剩余的修改,只需简单地按足够多次 j. 就可以了。
  • 在技巧 3 中,我们想为每个 + 号的前后各添加一个空格。我们先用 f+ 命令跳到目标字符上,然后用 s 命令把一个字符替换成 3 个,做完这步准备后,我们就可以按若干次 ;. 完成此任务。
  • 在技巧 5 中,我们想把每处出现单词“content”的地方都替换成“copy”。我们使用 * 命令来查找目标单词,然后用 cw 命令修改第一处地方。做完这步准备后,就可以用 n 键跳到下一匹配项,然后用 . 键做相同的修改。要完成这项任务,只需简单地按足够多次 n. 就行了。

OK

0%